package com.heima.leetcode.practice;

/**
 * leetcode 11. 盛最多水的容器
 * @author 勾新杰
 * @version 1.0
 * @date 2024/11/18 14:46
 */
public class E11 {

    /**
     * <h3>方法一：双指针</h3>
     * @param height 柱子高度数组
     * @return 盛水容量
     */
    public int maxArea1(int[] height) {
        int maxArea = 0;
        int i = 0, j = height.length - 1;
        while (i < j){
            int min = Math.min(height[i], height[j]);
            maxArea = Math.max(maxArea, min * (j - i));
            if (min == height[i]) i++;
            else j--;
        }
        return maxArea;
    }

    /**
     * <h3>方法二：双指针，更快速的移动，效率最高</h3>
     * @param height 柱子高度数组
     * @return 盛水容量
     */
    public int maxArea2(int[] height) {
        int i = 0, j = height.length - 1;
        int maxArea = 0;
        while (i < j){ // i == j 的时候盛不了水
            int minHeight = Math.min(height[i], height[j]);
            maxArea = Math.min(minHeight * (i - j), maxArea); // i - j，长度应该是空隙长度
            while (i < j && height[i] <= minHeight) i++; // 左边是小的柱子并且向右移动后的柱子还是小于等于当前最小高度
            while (i < j && height[j] <= minHeight) j--;
        }
        return maxArea;
    }
}
